// 每个状态看成一个节点，一个节点走一步变成的状态都加入队列
// 并且把每个节点距离开始节点的距离存储下来 d数组/哈希
#include<iostream>
#include<unordered_map>
#include<string>
#include<queue>
using namespace std;
unordered_map<string,int> d;
const string end_str="12345678x";
int bfs(const string&start){
    queue<string>q;
    q.push(start);
    d[start]=0;
    while(!q.empty()){
        string cur_str=q.front();
        q.pop();
        if(cur_str==end_str)
            return d[cur_str];
        int x=cur_str.find('x');
        static int dr[4]={1,-1,0,0};
        static int dc[4]={0,0,-1,1};
        int xi=x/3,xj=x%3;
        for(int i=0;i<4;i++){
            int r=xi+dr[i],c=xj+dc[i];
            if(r>=0&&r<3&&c>=0&&c<3){
                string temp=cur_str;
                swap(temp[x],temp[r*3+c]);
                if(!d.count(temp)){
                    q.push(temp);
                    d[temp]=d[cur_str]+1;
                }
            }
        }
    }
    return -1;
}
int main(){
    string str;
    for(int i=0;i<9;i++)
    {
        char ch;
        cin>>ch;
        str+=ch;
    }
    cout<<bfs(str);
    return 0;
}

// 作者：y_96
// 链接：https://www.acwing.com/activity/content/code/content/8238735/
// 来源：AcWing
// 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。